package com.copd.mapper;

import com.copd.entity.DoctorOperationLog;
import com.copd.entity.DoctorOperationDetail;
import com.copd.util.TimeUtil;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

@Mapper
public interface DoctorOperationLogMapper {
    
    /**
     * 插入操作日志
     * @param log 操作日志实体
     * @return 影响的行数
     */
    int insertLog(DoctorOperationLog log);
    
    /**
     * 插入操作详情
     * @param detail 操作详情实体
     * @return 影响的行数
     */
    int insertDetail(DoctorOperationDetail detail);
    
    /**
     * 查询操作日志列表（带分页）
     * @param doctorId 医生ID（可选）
     * @param patientId 患者ID（可选）
     * @param doctorName 医生姓名（可选，模糊匹配）
     * @param patientName 患者姓名（可选，模糊匹配）
     * @param operationType 操作类型（可选）
     * @param operationResult 操作结果（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param offset 分页偏移量
     * @param limit 每页大小
     * @return 日志列表
     */
    List<DoctorOperationLog> selectLogs(
        @Param("doctorId") Integer doctorId,
        @Param("patientId") Integer patientId,
        @Param("doctorName") String doctorName,
        @Param("patientName") String patientName,
        @Param("operationType") String operationType,
        @Param("operationResult") Boolean operationResult,
        @Param("startTime") Date startTime,
        @Param("endTime") Date endTime,
        @Param("offset") int offset,
        @Param("limit") int limit
    );
    
    /**
     * 使用字符串日期参数查询操作日志列表（带分页）- 辅助方法
     */
    default List<DoctorOperationLog> selectLogsWithStringDates(
        Integer doctorId,
        Integer patientId,
        String doctorName,
        String patientName,
        String operationType,
        Boolean operationResult,
        String startTimeStr,
        String endTimeStr,
        int offset,
        int limit
    ) {
        Date startTime = startTimeStr != null && !startTimeStr.isEmpty() ? 
                TimeUtil.parseDate(startTimeStr) : null;
        Date endTime = endTimeStr != null && !endTimeStr.isEmpty() ? 
                TimeUtil.parseDate(endTimeStr) : null;
                
        return selectLogs(
            doctorId,
            patientId,
            doctorName,
            patientName,
            operationType,
            operationResult,
            startTime,
            endTime,
            offset,
            limit
        );
    }
    
    /**
     * 查询操作日志总数（用于分页）
     * @param doctorId 医生ID（可选）
     * @param patientId 患者ID（可选）
     * @param doctorName 医生姓名（可选，模糊匹配）
     * @param patientName 患者姓名（可选，模糊匹配）
     * @param operationType 操作类型（可选）
     * @param operationResult 操作结果（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 日志总数
     */
    long countLogs(
        @Param("doctorId") Integer doctorId,
        @Param("patientId") Integer patientId,
        @Param("doctorName") String doctorName,
        @Param("patientName") String patientName,
        @Param("operationType") String operationType,
        @Param("operationResult") Boolean operationResult,
        @Param("startTime") Date startTime,
        @Param("endTime") Date endTime
    );
    
    /**
     * 使用字符串日期参数查询操作日志总数 - 辅助方法
     */
    default long countLogsWithStringDates(
        Integer doctorId,
        Integer patientId,
        String doctorName,
        String patientName,
        String operationType,
        Boolean operationResult,
        String startTimeStr,
        String endTimeStr
    ) {
        Date startTime = startTimeStr != null && !startTimeStr.isEmpty() ? 
                TimeUtil.parseDate(startTimeStr) : null;
        Date endTime = endTimeStr != null && !endTimeStr.isEmpty() ? 
                TimeUtil.parseDate(endTimeStr) : null;
                
        return countLogs(
            doctorId,
            patientId,
            doctorName,
            patientName,
            operationType,
            operationResult,
            startTime,
            endTime
        );
    }
    
    /**
     * 根据日志ID查询操作详情
     * @param logId 日志ID
     * @return 操作详情列表
     */
    List<DoctorOperationDetail> selectDetailsByLogId(@Param("logId") Integer logId);
    
    /**
     * 根据ID查询日志
     * @param logId 日志ID
     * @return 日志实体
     */
    DoctorOperationLog selectLogById(@Param("logId") Integer logId);
    
    /**
     * 检查医生ID是否存在
     * @param doctorId 医生ID
     * @return 存在返回true，不存在返回false
     */
    boolean checkDoctorExists(@Param("doctorId") Integer doctorId);
    
    /**
     * 检查患者ID是否存在
     * @param patientId 患者ID
     * @return 存在返回true，不存在返回false
     */
    boolean checkPatientExists(@Param("patientId") Integer patientId);
    
    /**
     * 删除指定患者的所有操作日志
     * @param patientId 患者ID
     * @return 影响的行数
     */
    int deletePatientOperationLogs(@Param("patientId") Integer patientId);
} 